home *** CD-ROM | disk | FTP | other *** search
/ Programming in Microsoft Windows with C# / Programacion en Microsoft Windows con C#.iso / Original Code / Edit List and Spin / NotepadCloneWithEdit / NotepadCloneWithEdit.cs < prev    next >
Encoding:
Text File  |  2001-01-15  |  9.7 KB  |  298 lines

  1. //---------------------------------------------------
  2. // NotepadCloneWithEdit.cs ⌐ 2001 by Charles Petzold
  3. //---------------------------------------------------
  4. using System;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7.  
  8. class NotepadCloneWithEdit: NotepadCloneWithFile
  9. {
  10.      MenuItem miEditUndo, miEditCut, miEditCopy, miEditPaste, miEditDelete;
  11.      string   strFind = "", strReplace = "";
  12.      bool     bMatchCase = false, bFindDown = true;
  13.  
  14.      public new static void Main()
  15.      {
  16.           Application.Run(new NotepadCloneWithEdit());
  17.      }
  18.      public NotepadCloneWithEdit()
  19.      {
  20.           strProgName = "Notepad Clone with Edit";
  21.           MakeCaption();
  22.           
  23.                // Edit menu
  24.  
  25.           MenuItem mi = new MenuItem("&Edit");
  26.           mi.Popup += new EventHandler(MenuEditOnPopup);
  27.           Menu.MenuItems.Add(mi);
  28.           int index = Menu.MenuItems.Count - 1;
  29.  
  30.                // Edit Undo menu item
  31.  
  32.           miEditUndo = new MenuItem("&Undo");
  33.           miEditUndo.Click += new EventHandler(MenuEditUndoOnClick);
  34.           miEditUndo.Shortcut = Shortcut.CtrlZ;
  35.           Menu.MenuItems[index].MenuItems.Add(miEditUndo);
  36.           Menu.MenuItems[index].MenuItems.Add("-");
  37.  
  38.                // Edit Cut menu item
  39.  
  40.           miEditCut = new MenuItem("Cu&t");
  41.           miEditCut.Click += new EventHandler(MenuEditCutOnClick);
  42.           miEditCut.Shortcut = Shortcut.CtrlX;
  43.           Menu.MenuItems[index].MenuItems.Add(miEditCut);
  44.  
  45.                // Edit Copy menu item
  46.  
  47.           miEditCopy = new MenuItem("&Copy");
  48.           miEditCopy.Click += new EventHandler(MenuEditCopyOnClick);
  49.           miEditCopy.Shortcut = Shortcut.CtrlC;
  50.           Menu.MenuItems[index].MenuItems.Add(miEditCopy);
  51.  
  52.                // Edit Paste menu item
  53.  
  54.           miEditPaste = new MenuItem("&Paste");
  55.           miEditPaste.Click += new EventHandler(MenuEditPasteOnClick);
  56.           miEditPaste.Shortcut = Shortcut.CtrlV;
  57.           Menu.MenuItems[index].MenuItems.Add(miEditPaste);
  58.  
  59.                // Edit Delete menu item
  60.  
  61.           miEditDelete = new MenuItem("De&lete");
  62.           miEditDelete.Click += new EventHandler(MenuEditDeleteOnClick);
  63.           miEditDelete.Shortcut = Shortcut.Del;
  64.           Menu.MenuItems[index].MenuItems.Add(miEditDelete);
  65.           Menu.MenuItems[index].MenuItems.Add("-");
  66.  
  67.                // Edit Find menu item
  68.  
  69.           mi = new MenuItem("&Find...");
  70.           mi.Click += new EventHandler(MenuEditFindOnClick);
  71.           mi.Shortcut = Shortcut.CtrlF;
  72.           Menu.MenuItems[index].MenuItems.Add(mi);
  73.  
  74.                // Edit Find Next menu item
  75.  
  76.           mi = new MenuItem("Find &Next");
  77.           mi.Click += new EventHandler(MenuEditFindNextOnClick);
  78.           mi.Shortcut = Shortcut.F3;
  79.           Menu.MenuItems[index].MenuItems.Add(mi);
  80.  
  81.                // Edit Replace menu item
  82.  
  83.           mi = new MenuItem("&Replace...");
  84.           mi.Click += new EventHandler(MenuEditReplaceOnClick);
  85.           mi.Shortcut = Shortcut.CtrlH;
  86.           Menu.MenuItems[index].MenuItems.Add(mi);
  87.           Menu.MenuItems[index].MenuItems.Add("-");
  88.  
  89.                // Edit Select All menu item
  90.  
  91.           mi = new MenuItem("Select &All");
  92.           mi.Click += new EventHandler(MenuEditSelectAllOnClick);
  93.           mi.Shortcut = Shortcut.CtrlA;
  94.           Menu.MenuItems[index].MenuItems.Add(mi);
  95.  
  96.                // Edit Time/Date menu item
  97.  
  98.           mi = new MenuItem("Time/&Date");
  99.           mi.Click += new EventHandler(MenuEditTimeDateOnClick);
  100.           mi.Shortcut = Shortcut.F5;
  101.           Menu.MenuItems[index].MenuItems.Add(mi);
  102.      }
  103.      void MenuEditOnPopup(object obj, EventArgs ea)
  104.      {
  105.           miEditUndo.Enabled = txtbox.CanUndo;
  106.  
  107.           miEditCut.Enabled = 
  108.           miEditCopy.Enabled = 
  109.           miEditDelete.Enabled  = (txtbox.SelectionLength > 0);
  110.  
  111.           miEditPaste.Enabled = 
  112.                Clipboard.GetDataObject().GetDataPresent(typeof(string));
  113.      }
  114.      void MenuEditUndoOnClick(object obj, EventArgs ea)
  115.      {
  116.           txtbox.Undo();
  117.           txtbox.ClearUndo();
  118.      }
  119.      void MenuEditCutOnClick(object obj, EventArgs ea)
  120.      {
  121.           txtbox.Cut();
  122.      }
  123.      void MenuEditCopyOnClick(object obj, EventArgs ea)
  124.      {
  125.           txtbox.Copy();
  126.      }
  127.      void MenuEditPasteOnClick(object obj, EventArgs ea)
  128.      {
  129.           txtbox.Paste();
  130.      }
  131.      void MenuEditDeleteOnClick(object obj, EventArgs ea)
  132.      {
  133.           txtbox.Clear();
  134.      }
  135.      void MenuEditFindOnClick(object obj, EventArgs ea)
  136.      {
  137.           if (OwnedForms.Length > 0)
  138.                return;
  139.  
  140.           txtbox.HideSelection = false;
  141.  
  142.           FindDialog dlg = new FindDialog();
  143.  
  144.           dlg.Owner     = this;
  145.           dlg.FindText  = strFind;
  146.           dlg.MatchCase = bMatchCase;
  147.           dlg.FindDown  = bFindDown;
  148.           dlg.FindNext += new EventHandler(FindDialogOnFindNext);
  149.           dlg.CloseDlg += new EventHandler(FindReplaceDialogOnCloseDlg);
  150.           dlg.Show();
  151.      }
  152.      void MenuEditFindNextOnClick(object obj, EventArgs ea)
  153.      {
  154.           if (strFind.Length == 0)
  155.           {
  156.                if (OwnedForms.Length > 0)
  157.                     return;
  158.  
  159.                MenuEditFindOnClick(obj, ea);
  160.           }
  161.           else
  162.                FindNext();
  163.      }
  164.      void MenuEditReplaceOnClick(object obj, EventArgs ea)
  165.      {
  166.           if (OwnedForms.Length > 0)
  167.                return;
  168.  
  169.           txtbox.HideSelection = false;
  170.  
  171.           ReplaceDialog dlg = new ReplaceDialog();
  172.  
  173.           dlg.Owner       = this;
  174.           dlg.FindText    = strFind;
  175.           dlg.ReplaceText = strReplace;
  176.           dlg.MatchCase   = bMatchCase;
  177.           dlg.FindDown    = bFindDown;
  178.           dlg.FindNext   += new EventHandler(FindDialogOnFindNext);
  179.           dlg.Replace    += new EventHandler(ReplaceDialogOnReplace);
  180.           dlg.ReplaceAll += new EventHandler(ReplaceDialogOnReplaceAll);
  181.           dlg.CloseDlg   += new EventHandler(FindReplaceDialogOnCloseDlg);
  182.           dlg.Show();
  183.      }
  184.      void MenuEditSelectAllOnClick(object obj, EventArgs ea)
  185.      {
  186.           txtbox.SelectAll();
  187.      }
  188.      void MenuEditTimeDateOnClick(object obj, EventArgs ea)
  189.      {
  190.           DateTime dt = DateTime.Now;
  191.           txtbox.SelectedText = dt.ToString("t") + " " + dt.ToString("d");
  192.      }
  193.      void FindDialogOnFindNext(object obj, EventArgs ea)
  194.      {
  195.           FindReplaceDialog dlg = (FindReplaceDialog) obj;
  196.  
  197.           strFind    = dlg.FindText;
  198.           bMatchCase = dlg.MatchCase;
  199.           bFindDown  = dlg.FindDown;
  200.  
  201.           FindNext();
  202.      }
  203.      bool FindNext()
  204.      {
  205.           if (bFindDown)
  206.           {
  207.                int iStart = txtbox.SelectionStart + txtbox.SelectionLength;
  208.  
  209.                while (iStart + strFind.Length <= txtbox.TextLength)
  210.                {
  211.                     if (string.Compare(strFind, 0, txtbox.Text, iStart, 
  212.                                        strFind.Length, !bMatchCase) == 0)
  213.                     {
  214.                          txtbox.SelectionStart = iStart;
  215.                          txtbox.SelectionLength = strFind.Length;
  216.                          return true;
  217.                     }
  218.                     iStart++;
  219.                }
  220.           }
  221.           else
  222.           {
  223.                int iStart = txtbox.SelectionStart - strFind.Length;
  224.  
  225.                while (iStart >= 0)
  226.                {
  227.                     if (string.Compare(strFind, 0, txtbox.Text, iStart, 
  228.                                        strFind.Length, !bMatchCase) == 0)
  229.                     {
  230.                          txtbox.SelectionStart = iStart;
  231.                          txtbox.SelectionLength = strFind.Length;
  232.                          return true;
  233.                     }
  234.                     iStart--;
  235.                }
  236.           }
  237.           MessageBox.Show("Cannot find \"" + strFind + "\"", strProgName,
  238.                           MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  239.           return false;
  240.      }
  241.      void ReplaceDialogOnReplace(object obj, EventArgs ea)
  242.      {
  243.           FindReplaceDialog dlg = (FindReplaceDialog) obj;
  244.  
  245.           strFind    = dlg.FindText;
  246.           strReplace = dlg.ReplaceText;
  247.           bMatchCase = dlg.MatchCase;
  248.  
  249.           if (string.Compare(strFind, txtbox.SelectedText, !bMatchCase) == 0)
  250.           {
  251.                txtbox.SelectedText = strReplace;
  252.           }
  253.           FindNext();
  254.      }
  255.      void ReplaceDialogOnReplaceAll(object obj, EventArgs ea)
  256.      {
  257.           FindReplaceDialog dlg = (FindReplaceDialog) obj;
  258.  
  259.           string str = txtbox.Text;
  260.           strFind    = dlg.FindText;
  261.           strReplace = dlg.ReplaceText;
  262.           bMatchCase = dlg.MatchCase;
  263.  
  264.           if (bMatchCase)
  265.           {
  266.                str = str.Replace(strFind, strReplace);
  267.           }
  268.           else
  269.           {
  270.                for (int i = 0; i < str.Length - strFind.Length; )
  271.                {
  272.                     if (String.Compare(str, i, strFind, 0, 
  273.                                              strFind.Length, true) == 0)
  274.                     {
  275.                          str = str.Remove(i, strFind.Length);
  276.                          str = str.Insert(i, strReplace);
  277.                          i += strReplace.Length;
  278.                     }
  279.                     else
  280.                     {
  281.                          i += 1;
  282.                     }
  283.                }
  284.           }
  285.           if (str != txtbox.Text)
  286.           {
  287.                txtbox.Text = str;
  288.                txtbox.SelectionStart = 0;
  289.                txtbox.SelectionLength = 0;
  290.                txtbox.Modified = true;
  291.           }
  292.      }
  293.      void FindReplaceDialogOnCloseDlg(object obj, EventArgs ea)
  294.      {
  295.           txtbox.HideSelection = true;
  296.      }
  297. }          
  298.